一、 红外介绍
IR(Infrared Radiation)
现有的红外遥控有两种方式,PWM(脉冲宽度调制)和PPM(脉冲位置调制)。
对应的两种编码形式的代表分别为NEC和PHILIPS的RC-5、RC-6、RC-7
Linux 内核中,IR 驱动仅支持 NEC 编码格式。
二、 驱动移植与验证
1. 修改 dts 打开 pwm
kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dts
根据原理图
可以看到红外部分采用的是 pwm3。
所以在 dts 中我们进行如下配置:
1 | &pwm3 { |
status = "okay";
表示打开 pwm3interrupts
是中断号compatible = "rockchip,remotectl-pwm";
linux 平台上默认的 IR 驱动为 drivers/input/remotectl/rockchip_pwm_remotectl.c ,这里会对应去匹配 driver。remote_pwm_id = <3>;
pwm我们采用的是第三组。handle_cpu_id = <0>;
ir_key1 为键值表,第一列是键值,第二列是响应的按码键。其中的值在最初可以不用填。后面第 3 小节后我们根据遥控器确定按键后再来修改。
2. 检查是否加载 IR 驱动
驱动代码在 drivers/input/remotectl/rockchip_pwm_remotectl.c
出现如下 log 表示 IR 驱动正常加载。
1 | [ 0.656437] .. rk pwm remotectl v1.1 init |
根据 log 中 ff420030,我们后面(第三节)也可以找到 system/usr/keylayout/ff420030_pwm.kl 文件,这个文件用于将 Linux 层获取的键值映射到 Android 上对应的键值。
3. 获取 USERCODE 和 KEY 值
先通过以下命令使能 DBG_CODE 打印:
1 | echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print |
按遥控上的任意按键,可以看到类似如下信息:
USERCODE 这个遥控的 usercode,用以标识遥控种类。
RMC_GETDATA 表示键值。
我的遥控是这样子的,左边是我依次按键后根据 log 画出来遥控对应的键值。
4. 修改 dts 的 ir_key map
添加如下信息
1 | ir_key1 { |
5. 配置编译驱动选项
RK3399 平台默认配置有 IR 部分。
其他 Android 平台没有的需要添加。
- 配置文件 drivers/input/remotectl/Kconfig 添加
1 | config ROCKCHIP_REMOTECTL_PWM |
修改 drivers/input/remotectl 路径下的 Makefile,增加如下编译选项
1
obj-$(CONFIG_ROCKCHIP_REMOTECTL_PWM) += rockchip_pwm_remotectl.o
在 kernel 路径中 make menuconfig,添加 IR 驱动
1
2
3
4Device Drivers
-> Input device support
->[*]rockchip remotectl
[*]rockchip remoctrl pwm capture
6. 编译并烧录固件
在 kernel 下
1 | make -j4 rk3399-sapphire-excavator-edp.img |
烧录 kernel.img 和 resource.img
7. 验证结果
按照 3 中的方式打开 DBG Log
依次按键,看是否能实现相应功能。
如果有问题,查看打印中 RMC_GETDATA 的值是否和 dts 中对应。
三、 Android 键值映射
生成的 out/target/product/rk3399/system/usr/keylayout/ff420030_pwm.kl 文件用于将 Linux 层获取的键值映射到 Android 上对应的键值。
我们可以添加或者修改该文件的内容以实现不同的键值映射。
adb pull 后修改再 adb push 进去可以实现修改键值映射。
比如我在 Android 部分实现了 键盘鼠标切换功能。
那么我可以在 ff420030_pwm.kl 中添加
1 | key 388 TV_KEYMOUSE_MODE_SWITCH |
我要将 e4 按键设置为这个功能键,那么我就可以在 dts 中添加
1 | <0xe4 388>, |